package cn.zurish.cloud.work.modbus;

import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersRequest;
import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersResponse;
import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
import com.ghgande.j2mod.modbus.procimg.Register;

import java.net.InetAddress;

public class WorkstationRuntimeReader {

    private static final int MODBUS_PORT = 502;
    private static final int UNIT_ID = 1; // 设备单元ID，根据实际情况调整

    /**
     * 读取32位浮点数数据
     * @param host 设备IP地址
     * @param registerAddress 寄存器地址
     * @return 浮点数值
     */
    public static float readFloatValue(String host, int registerAddress) {
        TCPMasterConnection connection = null;
        try {
            InetAddress address = InetAddress.getByName(host);
            connection = new TCPMasterConnection(address);
            connection.setPort(MODBUS_PORT);
            connection.connect();

            // 创建读取多个寄存器请求（32位浮点数需要2个寄存器）
            ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(
                    registerAddress, 2);
            request.setUnitID(UNIT_ID);

            // 执行事务
            ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
            transaction.setRequest(request);
            transaction.execute();

            // 获取响应
            ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
                    transaction.getResponse();

            // 转换为32位浮点数（适配MCGSPro的小端序格式）
            return convertRegistersToFloat(response.getRegisters());

        } catch (Exception e) {
            e.printStackTrace();
            return Float.NaN;
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
    }

    /**
     * 将寄存器数组转换为32位浮点数（适配MCGSPro的小端序格式）
     * @param registers 寄存器数组（需要2个寄存器）
     * @return 浮点数值
     */
    private static float convertRegistersToFloat(Register[] registers) {
        if (registers.length < 2) {
            throw new IllegalArgumentException("需要至少2个寄存器来构成32位浮点数");
        }

        // 获取两个寄存器的值（MCGSPro使用小端序）
        int lowRegister = registers[0].getValue();   // 低位寄存器
        int highRegister = registers[1].getValue();  // 高位寄存器

        // 组合成32位整数（小端序格式）
        int intValue = (highRegister << 16) | (lowRegister & 0xFFFF);

        // 转换为浮点数
        return Float.intBitsToFloat(intValue);
    }

    public static void main(String[] args) {
        String host = "localhost"; // 替换为实际设备IP地址

        // 读取左工位运行时间小时数 (地址168)
        float leftHour = readFloatValue(host, 168);
        System.out.println("左工位运行时间小时数: " + leftHour + " 小时");

        // 读取左工位运行时间分钟数 (地址170)
        float leftMinute = readFloatValue(host, 170);
        System.out.println("左工位运行时间分钟数: " + leftMinute + " 分钟");

        // 读取右工位运行时间小时数 (地址172)
        float rightHour = readFloatValue(host, 172);
        System.out.println("右工位运行时间小时数: " + rightHour + " 小时");

        // 读取右工位运行时间分钟数 (地址174)
        float rightMinute = readFloatValue(host, 174);
        System.out.println("右工位运行时间分钟数: " + rightMinute + " 分钟");
    }
}
